package com.kl.api;

import com.alibaba.fastjson.JSONObject;
import com.kl.annotation.UserLoginToken;
import com.kl.model.User;
import com.kl.service.TokenService;
import com.kl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("api")
public class UserApi {

    @Autowired
    UserService userService;
    @Autowired
    TokenService tokenService;

    /**
     * 登录
     * 登录成功后返回的数据格式
     * {
     * "user": {
     * "username": "张三",
     * "password": "123456",
     * "id": "1"
     * },
     * "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIn0.qfd0G-elhE1aGr15LrnYlIZ_3UToaOM5HeMcXrmDGBM"
     * }
     * ======================
     * token数据分成了三部份
     * 1、Header：头部，通常头部有两部分信息：
     * 声明类型type，这里是JWT（type=jwt）
     * 加密算法，自定义(rs256/base64/hs256)
     * 我们会对头部进行base64加密（可解密），得到第一部分数据
     * 2、Payload：载荷，就是有效数据，一般包含下面信息：
     * 用户身份信息-userid,username（注意，这里因为采用base64加密，可解密，因此不要存放敏感信息）
     * 注册声明：如token的签发时间，过期时间，签发人等
     * 这部分也会采用base64加密，得到第二部分数据
     * 3、Signature：base64加密，签名，是整个数据的认证信息
     * 一般根据前两步的数据，再加上服务的的密钥（secret，盐）（不要泄漏，最好周期性更换），
     * 通过加密算法生成，用于验证整个数据完整和可靠性
     */
    @PostMapping("/login")
    public Object login(User user) {
        JSONObject jsonObject = new JSONObject();
        User userForBase = userService.findByUsername(user);
        if (userForBase == null) {
            jsonObject.put("message", "登录失败,用户不存在");
        } else {
            if (!userForBase.getPassword().equals(user.getPassword())) {
                jsonObject.put("message", "登录失败,密码错误");
            } else {
                String token = tokenService.getToken(userForBase);
                jsonObject.put("token", token);
                jsonObject.put("user", userForBase);
            }
        }
        return jsonObject;
    }

    /**
     * 在方法上标注解，在拦截器中获取该注解标注的方法并执行注解校验逻辑
     */
    @UserLoginToken
    @GetMapping("/getMessage")
    public String getMessage() {
        return "你已通过验证";
    }
}
